package cn.edu.tcu.dao.admin;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import cn.edu.tcu.bean.AdminBean;
import cn.edu.tcu.db.DBFactory;
import cn.edu.tcu.myutils.MyUtil;

public class AdminDao {

	/**

	 * 根据参数查询管理员信息

	 * 

	 * @param adminB

	 *            查询参数实体对象

	 * @return 查询结果集

	 */
	public List<AdminBean> getAdminInfoByParams(AdminBean adminB) {
		// 返回值

		List<AdminBean> lst = new ArrayList<>();
		// 验证查询的sql语句 -- 默认的sql语句是查询所有的结果集

		StringBuilder sbSql = new StringBuilder("SELECT * FROM tbadmins WHERE isdeleted = 0 ");
		// 操作的sql语句的参数

		List<Object> lstParams = new ArrayList<>();
		// 查询参数实体对象不为null

		if (adminB != null) {
			// 根据前台传递的条件进行动态拼接查询条件:对于文本类型的字段采用模糊查询

			// 判断是否使用 用户名 进行查询（模糊查询）

			String strAdminName = adminB.getAdminName();
			if (strAdminName != null && !strAdminName.equals("")) {
				// 使用该条件进行模糊查询

				sbSql.append(" AND adminName LIKE ? ");
				// 添加查询参数

				lstParams.add("%" + strAdminName.trim() + "%");
			}
			// 判断是否使用 邮箱 进行查询（模糊查询）

			String strAdminMail = adminB.getAdminMail();
			if (strAdminMail != null && !strAdminMail.equals("")) {
				// 使用该条件进行模糊查询

				sbSql.append(" AND AdminMail LIKE ? ");
				// 添加查询参数

				lstParams.add("%" + strAdminMail.trim() + "%");
			}
			// 判断是否使用 电话 进行查询（模糊查询）

			String strAdminTel = adminB.getAdminTel();
			if (strAdminTel != null && !strAdminTel.equals("")) {
				// 使用该条件进行模糊查询

				sbSql.append(" AND AdminTel LIKE ? ");
				// 添加查询参数

				lstParams.add("%" + strAdminTel.trim() + "%");
			}

			// 判断是否使用 生日的开始时间 进行查询

			Date dateAdminBirthday = adminB.getAdminBirthday();
			if (dateAdminBirthday != null) {
				// 使用该条件进行模糊查询

				sbSql.append(
						" AND DATE_FORMAT(adminBirthday,'%Y-%m-%d %H:%i:%s')  >= DATE_FORMAT(?,'%Y-%m-%d %H:%i:%s')  ");
				// 添加查询参数

				lstParams.add(MyUtil.convertDate2String(dateAdminBirthday, "yyyy-MM-dd HH:mm:ss"));
			}

			// 判断是否使用 生日的结束时间 进行查询

			Date dateAdminBirthday2 = adminB.getAdminBirthday2();
			if (dateAdminBirthday2 != null) {
				// 使用该条件进行模糊查询

				sbSql.append(
						" AND DATE_FORMAT(adminBirthday,'%Y-%m-%d %H:%i:%s')  <= DATE_FORMAT(?,'%Y-%m-%d %H:%i:%s')  ");
				// 添加查询参数

				lstParams.add(MyUtil.convertDate2String(dateAdminBirthday2, "yyyy-MM-dd HH:mm:ss"));
			}
		}
		// 执行查询操作

		lst = DBFactory.getDBDriverInstance().query(sbSql.toString(), new BeanListHandler<>(AdminBean.class),
				lstParams.toArray());
		// 返回

		return lst;
	}

	/**
	 * 根据主键id获取管理员信息
	 * 
	 * @param strAdminId
	 *            主键id
	 * @return 管理员对象
	 */
	public AdminBean getAdminInfoById(String strAdminId) {
		// 返回值
		AdminBean adminB = new AdminBean();
		// 验证查询的sql语句
		String strSql = "SELECT * FROM tbadmins WHERE isdeleted = 0 AND adminId = ?";
		// 执行查询操作
		adminB = DBFactory.getDBDriverInstance().query(strSql, new BeanHandler<>(AdminBean.class), strAdminId);
		// 返回
		return adminB;
	}

	/**
	 * 获取所有的管理员信息
	 * 
	 * @param sortType
	 *            排序类型：0 主键倒序排列，其他：主键正序排列
	 * @return
	 */
	public List<AdminBean> getAllAdminInfo(int sortType) {
		// 返回值
		List<AdminBean> lst = new ArrayList<>();
		// 验证查询的sql语句
		String strSql = "SELECT * FROM tbadmins WHERE isdeleted = 0 ";
		// 设置排序标准
		if (sortType == 0) {
			strSql += " order by adminId desc";
		}
		// 执行查询操作
		lst = DBFactory.getDBDriverInstance().query(strSql, new BeanListHandler<>(AdminBean.class));
		// 返回
		return lst;
	}

	/**
	 * 新增或修改管理员信息 新增和修改操作区别于：参数实体变量有没有主键字段
	 * 
	 * @param adminB
	 *            被修改的内容
	 * @return 修改操作结果
	 */
	public int saveOrUpdateAdminInfo(AdminBean adminB) {
		// 返回值
		int iRe = 0;
		if (adminB != null) {
			// 操作的sql语句
			String strSql = "";
			// 操作的sql语句的参数
			Object[] params = {};
			// 主键字段为null，则是新增操作
			if (adminB.getAdminId() == null) {
				// 新增操作
				// 保存处理的sql语句
				strSql = "INSERT INTO tbadmins(adminName,adminPsw,adminMail,adminTel,adminBirthday,adminImg ) VALUES(?,?,?,?,?,?)";
				// 新增的参数数组
				params = new Object[] { adminB.getAdminName(), MyUtil.MD5(adminB.getAdminPsw()), adminB.getAdminMail(),
						adminB.getAdminTel(), adminB.getAdminBirthday(), adminB.getAdminImg() };
			} else {
				// 修改操作
				// 修改处理的sql语句
				strSql = "UPDATE tbadmins SET adminName =?,adminPsw =?,adminMail =?,adminTel =?,adminBirthday =? ";
				// 判定是否需要修改图片内容
				if (adminB.getAdminImg() != null) {
					strSql += ",adminImg =? where adminid =?";
					params = new Object[] { adminB.getAdminName(), MyUtil.MD5(adminB.getAdminPsw()),
							adminB.getAdminMail(), adminB.getAdminTel(), adminB.getAdminBirthday(),
							adminB.getAdminImg(), adminB.getAdminId() };
				} else {
					strSql += " where adminid =?";
					params = new Object[] { adminB.getAdminName(), MyUtil.MD5(adminB.getAdminPsw()),
							adminB.getAdminMail(), adminB.getAdminTel(), adminB.getAdminBirthday(),
							adminB.getAdminId() };
				}
			}
			// 调用db层进行数据库保存
			iRe = DBFactory.getDBDriverInstance().update(strSql, params);
		}
		// 返回
		return iRe;
	}

	/**
	 * 逻辑删除指定Id的数据记录
	 * 
	 * @param strAdminId
	 *            数据记录Id
	 * @return 删除操作的返回结果
	 */
	public int deleteAdminInfoById(String strAdminId) {
		// 返回值
		int iRe = 0;
		// 采用逻辑删除：修改状态为字段即可， 0-未删除，1-已删除
		// 修改操作
		// 修改处理的sql语句
		String strSql = " UPDATE tbadmins SET isdeleted = 1 where adminid =? ";
		// 操作的sql语句的参数
		Object[] params = { strAdminId };
		// 调用db层进行数据库保存
		iRe = DBFactory.getDBDriverInstance().update(strSql, params);
		// 返回
		return iRe;
	}

	/**
	 * 用户登录验证
	 * 
	 * @param strUserName
	 *            用户名
	 * @param strUserPsw
	 *            密码
	 * @return 验证结果：true-成功；false-失败；
	 */
	public boolean isAdminLogined(String strUserName, String strUserPsw) {
		// 返回值
		boolean isLogined = false;
		// 验证查询的sql语句
		String strSql = "SELECT * FROM tbadmins WHERE adminName=? AND adminPsw=?";
		List<AdminBean> lstAdmins = DBFactory.getDBDriverInstance().query(strSql,
				new BeanListHandler<>(AdminBean.class), strUserName, strUserPsw);
		// 判定是否登录成功
		if (lstAdmins != null && lstAdmins.size() > 0) {
			// 验证登录成功
			isLogined = true;
		}
		return isLogined;
	}

	/**
	 * 用户登录验证
	 * 
	 * @param adminB
	 *            管理员实体类（用于传参）
	 * @return 验证结果：true-成功；false-失败；
	 */
	public boolean isAdminLogined(AdminBean adminB) {
		// 返回值
		boolean isLogined = false;
		// 验证查询的sql语句
		String strSql = "SELECT * FROM tbadmins WHERE adminName=? AND adminPsw=?";
		// 使用密码的md5的密文和数据库的密码字段进行比较
		List<AdminBean> lstAdmins = DBFactory.getDBDriverInstance().query(strSql,
				new BeanListHandler<>(AdminBean.class), adminB.getAdminName(), MyUtil.MD5(adminB.getAdminPsw()));
		// 判定是否登录成功
		if (lstAdmins != null && lstAdmins.size() > 0) {
			// 验证登录成功
			isLogined = true;
		}
		return isLogined;
	}
}
